"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
/**
 * 类型保护
 * 通过一些关键字 typeof  instanceof  for in 来缩小范围
 */
function add(input) {
    if (typeof input === 'string') {
    }
    else if (typeof input === 'number') {
    }
}
var Animal = /** @class */ (function () {
    function Animal() {
    }
    return Animal;
}());
var Bird = /** @class */ (function (_super) {
    __extends(Bird, _super);
    function Bird() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    return Bird;
}(Animal));
var Dog = /** @class */ (function (_super) {
    __extends(Dog, _super);
    function Dog() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    return Dog;
}(Animal));
function getName(name) {
    if (name instanceof Dog) {
        console.log(name);
    }
    else if (name instanceof Bird) {
        console.log(name);
    }
}
// null 保护
function getFirstLetter(s) {
    // 方式一
    // if (s === null) {
    //   return ''
    // }
    // return s.charAt(0) // 当 strictNullChecks 为true时 不通过
    // 方式二
    // return s = s || ''
    // 方式三
    // return s!.charAt(0)
    // 方式四
    return s === null || s === void 0 ? void 0 : s.charAt(0);
}
getFirstLetter(null);
getFirstLetter('123');
// 通过变量不同取值来辨识
function getButton(button) {
    if (button.class === 'warning') {
        console.log(button); // button: WarningButton
    }
    if (button.class === 'danger') {
        console.log(button); // button: DangerButton
    }
}
var reducer = function (action) {
    switch (action.type) {
        case 'add':
            action.payload.username;
            break;
        case 'delete':
            action.payload;
            break;
        default:
            break;
    }
};
function getNumber(x) {
    if ('swing' in x) {
        console.log(x);
    }
    if ('leg' in x) {
        console.log(x);
    }
}
// 自定义类型保护
var a;
(function (a) {
    // 语法  类型谓词 parameterName is Type
    // function isType(type: Type1 | Type2):type is Type1 {
    // }
    // 示例
    function isBird(x) {
        return x.leg === 2;
    }
    function getAnimal(x) {
        if (isBird(x)) {
            console.log(x);
        }
        else {
            console.log(x);
        }
    }
})(a || (a = {}));
// unknown 是any的安全类型
// any是任意类型 可以对any类型的数据做任何操作 不需要做类型检查
var value;
value = 1;
value = '';
value = true;
value = [];
value = {};
value.length;
value.methods();
var value2;
value2 = '';
value2 = 2;
value2 = [];
value2 = {};
value2 = true;
// 安全类型可以赋值 但不能调用属性或方法
// 错误 value2.methods()
// 错误 value2.length
// 类型断言
value2 = 'smd';
value2.toLowerCase();
// typeof检查
if (typeof value2 === 'string') {
    value2.toLowerCase();
}
var c = {
    name: '134',
    age: 20
};
var cc = '123';
// unknown类型只能判断是否相等  不能做运算
var aa;
var bb;
if (aa === bb) { }
if (aa !== bb) { }
